package main

import (
	"fmt"
	"sync"
)

func consumer(queue <-chan int) {
	// 单向取数据的
	defer wg.Done()
	for data := range queue {
		fmt.Println(data)
	} //会自动判断管道是否已经关闭

	// 手动判断是否已经关闭
	//for {
	//	data, ok := <-queue
	//	if !ok {
	//		break
	//	}
	//	fmt.Println(data, ok)
	//	time.Sleep(time.Second)
	//}

}

//func stock(queue chan<- int) {
//	// 单向放数据
//	defer wg.Done()
//	for {
//		queue <- 1
//		time.Sleep(time.Second)
//	}
//}

var wg sync.WaitGroup

func main() {
	/*
		 chennel 提供了一种通信机制，定向
		1、 无缓冲 .// 会死锁  // 需要先有接受者，再放值；有缓冲先放接受者还是先放值的都可以
		2、双向的还是单向的

	*/

	var msg chan int // 普通的双向的channel       可以转变为单向的
	//var msg chan<- int // 单向放的类型
	//var msg <- chan int // 单向取的channel
	// 初始化这个channel
	msg = make(chan int, 10) // 第一种初始化方式： 无缓冲 .// 会死锁  // 需要先有接受者
	//msg = make(chan int, 1) // 第二种方式： 有缓冲空间的
	//在go 中 make 初始化有三种，1.slice 2. map  3.channel

	//msg <- 2 //  你这个管道看起来就是一个有空间的数组 // 死锁
	wg.Add(1)
	msg <- 1
	msg <- 2
	go consumer(msg) //  无缓冲 .// 会死锁  // 需要先有接受者
	msg <- 1         // 将1 放入到channel 中
	//msg <- 2

	//fmt.Println("等待反回值")
	//fmt.Println(<-msg)

	close(msg) // 关闭channel ，已经关闭的channel 不能再发送数据了
	// 已经挂壁的channel 能够继续取数据，直到数据取完为止
	wg.Wait()

}
